當你將資料都清理完畢,並且觀察完所有的分布之後,剩下的就是對剩餘的特徵進行調整或是新增特徵了。
我們以年齡作為例子,將數據分為三個區間分別是低、中、高,這在數據中會有著減少複雜程度的效果(但也因此會丟失一些資訊),我們可以新增一個特徵叫做年齡區間,同時保留年齡的資料來強化不同區間的影響,這種將數值轉為區間的做法在實務運用上可能較常見,因為模型不一定會在你希望產生差別的地方進行分類,例如39歲跟40歲對你的意義不同,但對模型來說1、2歲與39、40歲之間不同的程度是一樣的,這種作法能夠主觀的加入你想要的結果。
pandas有內建一個pd.cut函式,能夠對數值型態進行分類,例如我們常見的將分數分為ABCDF等等操作可以透過分箱轉換來達成,這次我們要利用這個方法來將年齡分為低中高三個區間。
sort_age = df.loc[:,"age"].sort_values() # 首先找到1/3與2/3的數據
left, right = sort_age.iloc[int(len(df)/3)],sort_age.iloc[int(len(df)*2/3)]
print(left ,right)
# -0.0200447087828888 0.0235457526293458
cut函數有幾個重要的參數,第一個是data,第二個是bins
,以及第三個labels
,bins是指你需要切的位置,例如要根據60分打入及格與不及格的標籤,則需要設定bins=[0,60,100],labels則是需要打上的文字,需要比bins少一個
,所以此例就是輸入labels=["不及格","及格"],順序有差別,記得不要弄反了。
# 新增一個column age_label 當中的數據是將年齡分為低、中、高三個區間
df.loc[:,"age_label"] = pd.cut(df.loc[:,"age"],bins = [-1,left,right,1],labels=["low","medium","high"])
df.head()
在數據當中盡量避免使用中文,有可能會產生顯示問題,使用英文可以減少很多需要額外處理的項目。
現在我們要將類別量尺的列轉換成正確的形式,才能夠讓模型預測過程中不會因為錯誤的類型而出錯,並且能夠將字串型態的變數納入模型。
首先要注意的是整筆特徵的型態
,例如int、float、object等等,在dataframe裡面十分常見的類型就是object(通用類型),除了數值、日期等類型以外的變數,包含object都會在pd.getdummies當中被轉換為我們稱的dummy variable,也是one-hot encoding會得到的產物,所以在處理前要十分注意,避免錯將數值型態保留成object導致維度數量爆增。
df.dtypes # 檢查變數型態
還記得我們當初所說的嗎?性別應該是類別量尺,但在這裡還是數值型態,因此我們要使用astype
將性別這行轉型。
df.loc[:,"sex"] = df.loc[:,"sex"].astype(str) # 改變型態
df.dtypes
修改完型態之後,就可以直接將數據丟入pd.getdummies來產生我們想要的結果了
pd.get_dummies(df) # 將數據集中所有非數值的變數轉換為dummy variable
在這裡順便解釋一下,所有pandas的操作都會直接顯示出來,但不會指派進去任何變數,因此可以先執行一遍看一下是否是自己想要的結果,如果不是的話可以再行調整,上面這行執行完畢之後記得要指派給一個變數才會真的存取。
dummies = pd.get_dummies(df)
下篇開始將會講解基礎的機器學習模式~